import threading
import tkinter as tk
from tkinter import filedialog, messagebox, simpledialog
from tkinter import ttk
from PIL import Image, ImageTk
from Registration import Registration
from checkdata import *
from views import setingPage, IdVerification, about
import pandas as pd


class WindowMain:
    def __init__(self, master):
        self.root = master
        self.root.title("✨  欢迎使用本软件 V2.1.2")
        # 设置窗口大小为 800x600，并居中显示
        win_width, win_height = 900, 600
        # self.root.geometry(f"{宽}x{高}")
        # 获取屏幕尺寸
        self.Wide_screen = self.root.winfo_screenwidth()
        self.High_screen = self.root.winfo_screenheight()
        # 计算居中位置
        x = (self.Wide_screen - win_width) // 2
        y = (self.High_screen - win_height) // 2
        self.root.geometry(f"{win_width}x{win_height}+{x}+{y}")

        # 窗口添加事件
        self.create_controls()  # 窗体添加控件 布局
        # 设置窗口左上角图标（仅支持 .ico 文件，Windows）
        self.root.iconbitmap("img/icon.ico")  # 替换为你的图标文件路径  设置图标界面出现卡顿现象 此放在窗口生成后
        self.create_parameter()  # init 初始化重要参数信息存放记录
        if not self.RwInI.Get_Config('log', 'test') == 'reset':
            print('log')
            self.btn_T3check.forget()
        self.notebook.select(self.tab2)  # 通过传入对应的 Frame 对象，切换到该 Frame 所在的 Tab
        self.toggle_left_panel()
        self.reg()

    def create_controls(self):
        # 创建一个水平方向的 PanedWindow（左右布局）
        self.paned = ttk.PanedWindow(self.root, orient=tk.HORIZONTAL)
        self.paned.pack(fill=tk.BOTH, expand=True)

        # 左侧面板（工具/功能区）
        self.left_panel = tk.Frame(self.paned, width=80, bg='lightblue', relief=tk.SUNKEN, bd=0)
        self.paned.add(self.left_panel)

        # 右侧面板（内容区）
        self.right_panel = tk.Frame(self.paned, bg='blue', relief=tk.SUNKEN, bd=0)
        self.paned.add(self.right_panel)
        # ===============# ...省略其他代码...
        # 加载图片文件（请确保 bg.png 存在于当前目录）
        self.minimize_image = tk.PhotoImage(file="img/bg.png")  #

        # 1. 在左侧面板中，使用内部 Frame 进行分组布局

        # 2. 功能按钮区域（靠左放置）—— 使用一个 Frame
        self.left_panel_frame = tk.Frame(self.left_panel, bg='lightblue')
        self.left_panel_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5)
        # 顶部区域：标签
        tk.Label(self.left_panel_frame,
                 text="工具 / 目录",
                 bg='lightblue',
                 font=('微软雅黑', 12, 'bold')
                 ).pack(pady=(20, 15))
        # 功能按钮 1, 2, 3（靠左排列）
        self.seting_btn = tk.Button(self.left_panel_frame, text="🔧\n设   置", width=10, command=self.on_btn_click_seting)
        self.seting_btn.pack(pady=10)
        self.IdVerification_btn = tk.Button(self.left_panel_frame, text="🤖\n身份证号码", width=10,
                                            command=self.on_btn_click_Verification)
        self.IdVerification_btn.pack(pady=10)

        self.about = tk.Button(self.left_panel_frame, text="🤝\n感    谢", width=10, command=self.on_btn_click_about)
        self.about.pack(pady=10)

        # 3. 最小化按钮区域（靠右放置）—— 使用另一个 Frame 或直接摆放在右侧
        # 我们直接把 toggle_btn 单独放在 left_panel 的右侧（用 side=RIGHT）
        self.toggle_btn = tk.Button(self.left_panel, text="《", command=self.toggle_left_panel, bg='lightblue',
                                    font=("微软雅黑", 5), width=1, )  # 设置按钮宽度为 1 字符宽度（近似像素宽度也行，但字符更通用）

        # 关键：将最小化按钮放在右侧（与功能按钮分开布局）
        self.toggle_btn.pack(side=tk.RIGHT, padx=0, pady=0, fill=tk.Y)

        # right_panel右侧面板（内容区）
        self.notebook = ttk.Notebook(self.right_panel)
        self.notebook.pack(fill=tk.BOTH, expand=True, padx=0, pady=0)

        # 选项卡1：首页
        self.tab1 = tk.Frame(self.notebook, bg='#E0E3EF')
        self.notebook.add(self.tab1, text="✨  欢迎")

        # 先添加背景标签
        self.bglabel = tk.Label(self.tab1)
        self.bglabel.place(x=0, y=0, relwidth=1, relheight=1)
        # 1. 使用 Pillow 加载原始图片
        self.imgbg = Image.open("img/bg.png")
        # 2. 绑定窗口大小变化事件，用于动态调整背景图
        self.root.bind("<Configure>", self.refresh_bgimage)
        # 3. 初始加载一次背景图
        self.refresh_bgimage()

        # 选项卡2：设置
        self.tab2 = tk.Frame(self.notebook, bg='#E0E3EF')
        self.notebook.add(self.tab2, text="数据校验")

        # 选项卡1：添加菜单
        # 【第1行】Label + Entry（拉伸） + Button
        tk.Label(self.tab2, text="文件目录:", bg="lightblue", font=("微软雅黑", 10)).grid(
            row=0, column=0, padx=25, pady=15, sticky="e")  # 左对齐，不拉伸

        self.filepath = tk.Entry(self.tab2, font=("微软雅黑", 10), width=50)
        self.filepath.grid(row=0, column=1, columnspan=1, padx=5, pady=10, sticky="w")  # 左右拉伸
        self.directory_path = os.getcwd()
        self.filepath.config(state="normal")
        if self.filepath.get() == '':
            self.filepath.insert(0, self.directory_path)  # 设置初始值
        # 再设置为只读
        self.filepath.config(state="readonly")
        self.dir_btn = tk.Button(self.tab2, text="选择目录", bg="#3282F6", font=("微软雅黑", 10),
                                 command=self.on_btn_click_get_directory)
        self.dir_btn.grid(row=0, column=2, padx=5, pady=5, sticky="w")  # 不拉伸

        # 【第2行】Button + Label（跨2列，拉伸）
        self.file_btn = tk.Button(self.tab2, text="单个校验", bg="#3282F6", font=("微软雅黑", 10),
                                  command=self.on_btn_click_singleCheck)
        self.file_btn.grid(row=1, column=0, padx=25, pady=5, sticky='w')  # 不拉伸

        self.filelist_btn = tk.Button(self.tab2, text="开始校验", bg="#3282F6", font=("微软雅黑", 10),
                                      command=self.on_btn_click_allCheck)
        self.filelist_btn.grid(row=1, column=0, padx=5, pady=5, sticky='e')  # 不拉伸

        self.resultlabel = tk.Label(self.tab2, text="这是一个跨两列的标签，会随窗口拉伸", font=("微软雅黑", 10),
                                    bg="lightyellow")
        self.resultlabel.grid(
            row=1, column=1, columnspan=2, padx=5, pady=5, sticky="ew")  # 左右拉伸，跨2列

        # 【第3行】Treeview（跨3列，全部拉伸）
        self.tree_view = ttk.Treeview(self.tab2, columns=("filename", "checkresult"), show="headings", height=8)
        self.tree_view.grid(
            row=2, column=0, columnspan=3, padx=20, pady=15, sticky="nsew")  # 上下左右全部拉伸，跨3列

        # 设置 Treeview 列标题
        self.tree_view.heading("filename", text="文件名称")
        self.tree_view.heading("checkresult", text="")
        self.tree_view.column("filename", width=300)
        self.tree_view.column("checkresult", width=10)
        # 添加 垂直滚动条（上下滚动
        v_scrollbar = ttk.Scrollbar(self.tab2, orient="vertical", command=self.tree_view.yview)
        v_scrollbar.grid(row=2, column=3, sticky="ns", padx=(0, 0), pady=15)  # 放在 Treeview 右侧
        self.tree_view.configure(yscrollcommand=v_scrollbar.set)  # 绑定 tree 的垂直滚动
        # 添加 水平滚动条（左右滚动）
        h_scrollbar = ttk.Scrollbar(self.tab2, orient="horizontal", command=self.tree_view.xview)
        h_scrollbar.grid(row=3, column=0, columnspan=3, sticky="ew", padx=20, pady=(0, 0))  # 放在 Treeview 下方
        self.tree_view.configure(xscrollcommand=h_scrollbar.set)  # 绑定 tree 的水平滚动

        self.tab2.grid_columnconfigure(1, weight=1)  # 第1行中的输入框所在列（column=1）左右拉伸
        self.tab2.grid_columnconfigure(2, weight=1)  # 第1行中的按钮右侧列，为了第2行 label 跨2列拉伸

        self.tab2.grid_columnconfigure(1, weight=1)  # 第2行中跨列标签的 第一列（与输入框同列）
        self.tab2.grid_columnconfigure(2, weight=1)  # 第2行中跨列标签的第2列

        # 第3行：tree 跨3列，所以 0,1,2 列都会参与拉伸（但 tree 自己用 sticky="nsew" 实现全方向拉伸）
        self.tab2.grid_columnconfigure(0, weight=1)
        self.tab2.grid_columnconfigure(1, weight=1)
        self.tab2.grid_columnconfigure(2, weight=1)
        self.tab2.grid_rowconfigure(2, weight=1)  # 第3行（tree所在行）可以上下拉伸

        # ==== 修改后代码 ====
        # 🎨 Treeview 美化代码开始
        # 创建样式对象
        style = ttk.Style()
        # 1. 表头（标题）样式
        style.configure(
            "Treeview.Heading",
            font=("微软雅黑", 11, "bold"),
            background="#AD6260",
            foreground="black")
        # 2. 单元格（内部）样式
        style.configure(
            "Treeview",
            font=("微软雅黑", 10),
            background="white",
            foreground="black",
            rowheight=50,
            fieldbackground="white",
            relief="solid",
            borderwidth=1
        )

        # 3. （可选）斑马纹效果
        # 先插入数据时给行打 tag，比如 "奇数行"/"偶数行"
        # 然后：
        self.tree_view.tag_configure("奇数行", background="#EBEBEB")
        self.tree_view.tag_configure("偶数行", background="#FFFED3")  #
        # 获取execl文件
        self.get_xls_files()
        # 选项卡3：关于
        self.tab3 = tk.Frame(self.notebook, bg='#F5F5F5')
        self.notebook.add(self.tab3, text="关于")
        # tk.Label(self.tab3, text="欢迎", font=("微软雅黑", 14), bg='white').pack(expand=True)
        tk.Label(self.tab3,
                 text="校验结果显示",
                 font=("微软雅黑", 14), bg='#F5F5F5').pack(pady=(10, 5), anchor="center", padx=10)
        ###################################################################
        # 假设这是在某个函数中，比如切换到 tab3 时调用，或者初始化 GUI 时调用

        # --- 1. 显示文件名 Label ---
        self.tab3filename_label = tk.Label(self.tab3, text=f"当前文件", font=("微软雅黑", 10))
        self.tab3filename_label.pack(pady=(10, 5), anchor="w", padx=10)

        # --- 2. 创建 Treeview 表格，用来显示 Excel 数据 ---
        # 定义表格的列名（与 Excel 字段一致）

        # --- 2. 创建一个 Frame，用来包裹 Treeview 和它的滚动条 ---
        frame_tree_scroll = tk.Frame(self.tab3)
        frame_tree_scroll.pack(side="left", fill="both", expand=True, padx=10, pady=5)

        # --- 3. 创建 Treeview（放在 Frame 里）---
        self.tab3tree = ttk.Treeview(frame_tree_scroll, show="headings", height=10)

        # --- 4. 创建 垂直滚动条（放在右侧）---
        scrollbar_y = ttk.Scrollbar(frame_tree_scroll, orient="vertical", command=self.tab3tree.yview)
        self.tab3tree.configure(yscrollcommand=scrollbar_y.set)

        # --- 5. 创建 水平滚动条（放在底部）---
        scrollbar_x = ttk.Scrollbar(frame_tree_scroll, orient="horizontal", command=self.tab3tree.xview)
        self.tab3tree.configure(xscrollcommand=scrollbar_x.set)

        # --- 6. 布局 Treeview 和两个滚动条（关键！）---
        self.tab3tree.grid(row=0, column=0, sticky="nsew")  # 表格占满左上区域

        scrollbar_y.grid(row=0, column=1, sticky="ns")  # 垂直滚动条在右侧，上下拉伸
        scrollbar_x.grid(row=1, column=0, sticky="ew")  # 水平滚动条在下方，左右拉伸

        # 让 Frame 内部网格可以自适应撑开
        frame_tree_scroll.grid_rowconfigure(0, weight=1)
        frame_tree_scroll.grid_columnconfigure(0, weight=1)

        # 至此，tab3 页面上方的 Label 显示了文件名，下方是表格展示数据
        ###################################################3
        # tk.Checkbutton(self.tab3, text="启用通知").pack(side='right', anchor='se', padx=20, pady=5)
        # tk.Checkbutton(self.tab3, text="自动保存").pack(side='right',anchor='se', padx=20, pady=5)
        # ✅ 在右下角添加一个【校验码】按钮
        self.btn_T3check = tk.Button(self.tab3, text="校验码", command=self.on_btn_Tab3_click,
                                     bg='#E0E0E0', font=("微软雅黑", 9))
        # 使用 side='right' 和 anchor='se' 让按钮定位在右下角
        self.btn_T3check.pack(side='right', anchor='se', padx=10, pady=10)

    #  ...记录系统重要参数信息...
    def create_parameter(self):
        # 记录left_panel状态
        self.left_panel_is_minimized = False
        self.left_panel_original_width = 160
        self.current_item = None
        self.tree_view.bind('<<TreeviewSelect>>', self.select_record)
        # 记录线程状态，判断时候后台校验中，不允许重复校验
        self.threading_runing = False
        # 记录seting_window窗口打开状态，判断避免重复打开
        self.seting_window_flag = False
        self.Verification_window_flag = False

        # 创建Registration实例
        self.rg = Registration()
        # 初始化配置文件
        configname = 'config/config.ini'
        self.RwInI = RwConfig(configname)

    def reg(self):
        try:
            self.rg.product_info = 'checkdata V2.1.2'
            self.rg.user_info = self.RwInI.Get_Config('工具', 'email')
            # 3. 设置AES密钥和IV（必须16/24/32字节密钥，16字节IV）
            self.rg.key = "0123456789abcdef0123456789abcdef"  # AES-256密钥（32字节）
            self.rg.iv = "1234567890abcdef"  # IV（16字节）
            rgkey = self.rg.decode_machine_code(self.RwInI.Get_Config('info', 'mic'), self.rg.key, self.rg.iv)
            # print(rgkey.hex())
            self.rg.key = rgkey.hex()
            mid = self.rg.md()
            get_id = self.RwInI.Get_Config('info', 'md')
            # print(self.rg.get_machine_finger().hex(), mf, mc, mid)
            if mid == get_id:
                self.reg = True
                print('匹配一致')
            else:
                self.reg = False
                print(mid, get_id)
                print('匹配不一致')
            self.RwInI.Set_Config('工具', 'soft', self.rg.product_info)
        except Exception as e:
            self.reg = False
            print(e)

    def on_btn_Tab3_click(self):
        # 获取当前日期和时间（也可以只取日期部分）
        now = datetime.now()  # 类型是 datetime.datetime
        current_date = now.date()  # 只取日期部分，类型是 datetime.date

        # 定义目标日期：2025年10月1日
        target_date = datetime(2026, 1, 1).date()

        # 判断当前日期是否小于 2025年10月1日
        if current_date < target_date:
            pwd = simpledialog.askstring("校验 ", "请输入校验码:")
            # 初始化配置文件  此处重新获取配置，不随系统共用
            configname = 'config/config.ini'
            resetini = RwConfig(configname)
            pd = pwd + resetini.Get_Config('工具', 'soft')
            tab3mr = self.RwInI.Get_Config('info', 'mr')
            print(f'pd={pd}, tab3mr={tab3mr}, pdmd5={self.rg.md5_handle(pd)}')
            if tab3mr == self.rg.md5_handle(pd):
                print('校验成功')
                mf = self.rg.mf()
                mc = self.rg.mc()
                md = self.rg.md()
                # print(mf, mc, md)
                self.RwInI.Set_Config('info', 'mf', mf)
                self.RwInI.Set_Config('info', 'mc', mc)
                self.RwInI.Set_Config('info', 'md', md)
                self.RwInI.Set_Config('log', 'test', 'exe')
            else:
                print("失败")
        else:
            pass

    # 单个文件校验click事件
    def on_btn_click_singleCheck(self):
        if self.threading_runing:
            messagebox.showwarning("警告", "当前存在正在校验中的进程，不允许重复执行")
            return
        if self.current_item:
            # 创建一个线程来执行合并操作
            data_thread = threading.Thread(target=self.Single_check, args=())
            # 启动线程
            data_thread.start()
            # 如果需要等待线程完成，可以调用 join 方法
            # data_thread.join()
        else:
            messagebox.showwarning("警告", "请先选择一个文件")

    # 全部文件校验click事件
    def on_btn_click_allCheck(self):
        if self.threading_runing:
            messagebox.showwarning("警告", "当前存在正在校验中的进程，不允许重复执行")
            return
        items = self.tree_view.get_children()  # 获取所有行ID
        # if len(items) == 1:   # 只有一条
        #     # 自动选择这条按钮
        #     only_item = items[0]
        #     self.tree_view.selection_set(only_item)
        #     selected_items = self.tree_view.selection()
        #     if selected_items:
        #         self.current_item = selected_items[0]  # 当前被选中的行
        #     print('current_item ', self.current_item)
        #     # selected_item = self.tree_view.item(self.current_item, "values")
        #     filename = self.tree_view.item(self.current_item, "values")[0]
        #     print('filename1：', filename)
        #     print('2', self.tree_view.item(self.current_item, "values")[0])
        #
        #     # 创建一个线程来执行合并操作
        #     data_thread = threading.Thread(target=self.Single_check, args=())
        #     # 启动线程
        #     data_thread.start()
        # elif len(items) > 1:    # 多个文件走批量处理
        if items:
            # 创建一个线程来执行合并操作
            data_thread = threading.Thread(target=self.all_check, args=())
            # 启动线程
            data_thread.start()
        else:
            messagebox.showwarning("警告", "没有找到需要校验的文件")

    # ✅ 函数：将 DataFrame 的指定列数据写入 Treeview，并先清空 Treeview
    def errsToTreeview(self, errdfdata):
        # 1. 清空 Treeview 中的所有旧数据（必须！）
        for item in self.tab3tree.get_children():
            self.tab3tree.delete(item)

        # 2. 定义列名（必须和 DataFrame 的列名一致）
        列名列表 = ["姓名", "公民身份号码", "起始年月", "截止年月", "基数", "单位比例",
                    "个人比例", "清算类型", "户名", "银行账号", "开户行名称", "异常信息", "序号"]
        # columns = ("姓名", "公民身份号码", "起始年月", "截止年月", "基数", "单位比例",
        #            "个人比例", "清算类型", "户名", "银行账号", "开户行名称", "异常信息")
        # 3. 检查 DataFrame 是否为空
        # if errdfdata is None or errdfdata.empty:
        #     messagebox.showwarning("提示", "没有错误信息！")
        #     return

        # 4. 检查 DataFrame 是否包含所有需要的列（可选，用于排查问题）
        缺失列 = [列 for 列 in 列名列表 if 列 not in errdfdata.columns]
        if 缺失列:
            messagebox.showerror("错误", f"DataFrame 中缺少以下列：{缺失列}，请检查列名！")
            print("当前 DataFrame 的列名是：", errdfdata.columns.tolist())
            return

        # 5. 设置 Treeview 的列（表头）
        self.tab3tree["columns"] = 列名列表  # 所有列
        self.tab3tree["show"] = "headings"  # 不显示默认的第一列（索引列）

        # 6. 设置每一列的标题、宽度、对齐方式
        for 列 in 列名列表:
            self.tab3tree.heading(列, text=列)  # 列标题
            if 列 in ["姓名", "起始年月", "截止年月", "基数", "清算类型", "户名", "银行账号", "开户行名称", "异常信息"]:
                self.tab3tree.column(列, width=50, anchor="center")  # 列宽100，居中对齐
            elif 列 in ["单位比例", "个人比例", "序号"]:
                self.tab3tree.column(列, width=20, anchor="center")  # 列宽100，居中对齐
            else:
                self.tab3tree.column(列, width=100, anchor="center")  # 列宽100，居中对齐
        self.tab3tree.tag_configure("奇数行", background="#EBEBEB")
        self.tab3tree.tag_configure("偶数行", background="#EEFF9D")  #
        # 7. 遍历 DataFrame 的每一行，将指定列的值插入到 Treeview
        i = 0
        for index, 行 in errdfdata.iterrows():
            # 按照 列名列表 的顺序，取出每一列的值，组成一个列表
            值列表 = [行[列] for 列 in 列名列表]
            tag = "奇数行" if i % 2 == 0 else "偶数行"
            # print(index)
            # self.tree_view.insert("", "end", values=(fn, ''), tags=(tag,))
            self.tab3tree.insert("", "end", values=值列表, tags=(tag,))  # 插入一行数据
            i += 1

    # 单个文件校验
    def Single_check(self):
        self.file_btn.config(state=tk.DISABLED)
        self.threading_runing = True
        try:
            #  print('Single_check', self.current_item)
            filename = self.tree_view.item(self.current_item, "values")[0]
            # print('filename：', filename)
            self.log_text_write(f"{filename}开始校验中……")
            check = checkdata()
            check.directory_path = self.directory_path
            check.export_dir = self.directory_path + "/导出结果"  # 导出结果存放文件夹
            check.count = self.reg
            # print(check.export_dir)
            if not os.path.exists(check.export_dir):
                os.makedirs(check.export_dir)
            restext, errsdf = check.check_date(filename)
            # print(self.current_item, restext, filename)
            self.tree_view.item(self.current_item, values=(filename, restext))
            self.file_btn.config(state=tk.NORMAL)
            self.threading_runing = False
            self.log_text_write(f"【{filename}】\n{restext}")
            # print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), f"选择的目录是: {dir_path}")
            self.tab3filename_label.config(text=f'{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}:    {filename}')
            # --- 3. 插入 DataFrame 数据到 Treeview ---
            self.errsToTreeview(errsdf)
            # print(errsdf)
        except Exception as e:
            self.file_btn.config(state=tk.NORMAL)
            self.threading_runing = False
            self.log_text_write(f"校验出现异常\n{e}")
            # print(e)

    # 所有文件校验
    def all_check(self):
        self.log_text_write(f"批量校验中，请耐心等待……⌛")
        self.file_btn.config(state=tk.DISABLED)
        self.filelist_btn.config(state=tk.DISABLED)
        self.threading_runing = True
        try:
            # 遍历所有行（所有 item）
            check = checkdata()
            check.directory_path = self.directory_path
            check.export_dir = self.directory_path + "/导出结果"  # 导出结果存放文件夹
            check.count = self.reg
            if not os.path.exists(check.export_dir):
                os.makedirs(check.export_dir)
            for i, item in enumerate(self.tree_view.get_children()):  # 获取所有子项（行）
                m = (i + 1) // 10 + 1
                n = (i + 1) % 10 + 1
                self.log_text_write(f"批量校验中，请耐心等待 …{'…' * n}{'⌛' * m}")
                # 获取该行的第一列的值
                filename = self.tree_view.item(item, "values")[0]
                # print('filename：', filename)
                restext, errsdf = check.check_date(filename)
                self.tree_view.item(item, values=(filename, restext))
                # print(i,item)
            self.file_btn.config(state=tk.NORMAL)
            self.filelist_btn.config(state=tk.NORMAL)
            self.threading_runing = False
            self.log_text_write(f"校验完成，共{len(self.tree_view.get_children())}个文件")
        except Exception as e:
            self.file_btn.config(state=tk.NORMAL)
            self.filelist_btn.config(state=tk.NORMAL)
            self.threading_runing = False
            self.log_text_write(f"已校验{(m - 1) * 10 + n - 1}个文件。出现异常：{e}")

    # tree控件选择事件关联函数，选择记录
    def select_record(self, event):
        self.current_item = self.tree_view.focus()
        # print('current_item se', self.current_item)
        selected_item = self.tree_view.item(self.current_item, "values")
        # print('selected_item se', selected_item)

    def get_xls_files(self):
        dir_path = self.filepath.get()
        # 创建一个空列表来存储文件名
        xls_files = []
        # 删除所有信息
        for _ in map(self.tree_view.delete, self.tree_view.get_children('')):
            pass
        # 遍历目录中的所有文件
        for filename in os.listdir(dir_path):
            # 检查文件扩展名是否为.xls或.xlsx
            if filename.endswith(('.xls', '.xlsx')):
                xls_files.append(filename)
                # 示例：插入带 tag 的数据（你可以替换成你的真实数据）
        for i, fn in enumerate(xls_files):
            tag = "奇数行" if i % 2 == 0 else "偶数行"
            self.tree_view.insert("", "end", values=(fn, ''), tags=(tag,))
        # print('xls_files:\n', xls_files)
        if xls_files:
            self.log_text_write(f"文件目录下共检索出{len(xls_files)}个文件")
        else:
            self.log_text_write("文件目录下没有检索出要校验的文件！")
        return xls_files

    # 创建设置信息录入函数 添加 和 修改 保存至config
    def on_btn_click_seting(self):
        if self.seting_window_flag:
            self.seting_window.destroy()  # 如果已经存在 则销毁原窗口
            self.seting_window_flag = False

        # # 创建一个 Toplevel 窗口
        self.seting_window = tk.Toplevel(self.root)
        self.seting_window.title("设置")

        # 设置窗口大小为 800x600，并居中显示
        w, h = 600, 500
        # self.root.geometry(f"{宽}x{高}")
        # 获取屏幕尺寸
        self.Wide_screen = self.root.winfo_screenwidth()
        self.High_screen = self.root.winfo_screenheight()
        # 计算居中位置
        x = (self.Wide_screen - w) // 2
        y = (self.High_screen - h) // 2
        self.seting_window.geometry(f"{w}x{h}+{x}+{y}")
        # 设置窗口左上角图标（仅支持 .ico 文件，Windows）
        self.seting_window.iconbitmap("img/set.ico")  # 替换为你的图标文件路径  设置图标界面出现卡顿现象
        self.seting_window.configure(bg='lightgray')  # 设置背景颜色为浅灰色
        self.seting_window_flag = True
        # 禁止用户调整 Toplevel 窗口的大小（宽和高都不可变）
        self.seting_window.resizable(False, False)
        Page = setingPage(self.seting_window)
        Page.pack()

    def on_btn_click_about(self):
        # 创建关于窗口（使用 Toplevel）
        about_window = tk.Toplevel()
        about_window.title("关于")
        # 设置窗口大小，并居中显示
        w, h = 450, 500
        # 获取屏幕尺寸
        self.Wide_screen = self.root.winfo_screenwidth()
        self.High_screen = self.root.winfo_screenheight()
        # 计算居中位置
        x = (self.Wide_screen - w) // 2
        y = (self.High_screen - h) // 2
        about_window.geometry(f"{w}x{h}+{x}+{y}")
        # about_window.geometry("450x500")
        about_window.resizable(False, False)  # 禁止调整窗口大小
        about_window.configure(bg="#f4f4f4")  # 背景色

        # 让窗口居中显示（简单方式）
        about_window.transient()  # 通常作为主窗口的子窗口  子窗口打开后不能操作主窗口
        about_window.grab_set()  # 模态窗口（可选）
        page = about()
        page.open_about(about_window)

    # 创建身份证号码校验
    def on_btn_click_Verification(self):
        if self.Verification_window_flag:
            self.Verification_window.destroy()  # 如果已经存在 则销毁原窗口
            self.Verification_window_flag = False

        # # 创建一个 Toplevel 窗口
        self.Verification_window = tk.Toplevel(self.root)
        self.Verification_window.title("身份证号码校验")

        # 设置窗口大小为 800x600，并居中显示
        w, h = 400, 340
        # self.root.geometry(f"{宽}x{高}")
        # 获取屏幕尺寸
        self.Wide_screen = self.root.winfo_screenwidth()
        self.High_screen = self.root.winfo_screenheight()
        # 计算居中位置
        x = (self.Wide_screen - w) // 2
        y = (self.High_screen - h) // 2
        self.Verification_window.geometry(f"{w}x{h}+{x}+{y}")
        # 设置窗口左上角图标（仅支持 .ico 文件，Windows）
        self.Verification_window.iconbitmap("img/zj.ico")  # 替换为你的图标文件路径  设置图标界面出现卡顿现象
        self.Verification_window.configure(bg='lightblue')  # 设置背景颜色为浅灰色
        self.Verification_window_flag = True
        # 禁止用户调整 Toplevel 窗口的大小（宽和高都不可变）
        self.Verification_window.resizable(False, False)

        # self.Verification_window.transient()  # 通常作为主窗口的子窗口   子窗口打开后不能操作主窗口 此业务作用不能影响主窗口故注释掉
        # self.Verification_window.grab_set()  # 模态窗口（可选）

        Page = IdVerification(self.Verification_window)
        Page.pack()

    # 选择目录事件函数
    def on_btn_click_get_directory(self):
        if self.threading_runing:
            messagebox.showwarning("警告", "数据校验中…………，不允许修改目录")
            return
        self.dir_btn.config(state=tk.DISABLED)
        # 打开目录选择对话框
        dir_path = filedialog.askdirectory(title="选择文件存放目录", initialdir=os.getcwd())
        # print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), f"选择的目录是: {dir_path}")
        # 打印选择的目录路径
        if dir_path:
            self.filepath.config(state="normal")
            self.filepath.delete(0, tk.END)  # 先清空输入框内容
            self.filepath.insert(0, dir_path)  # 设置初始值
            # 再设置为只读
            self.filepath.config(state="readonly")
            self.RwInI.Set_Config("config", "directory_path", dir_path)

            # print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),f"选择的目录是: {dir_path}")
        else:
            print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "未选择目录")
        self.directory_path = dir_path
        self.dir_btn.config(state=tk.NORMAL)
        self.get_xls_files()

    def refresh_bgimage(self, event=None):
        if not hasattr(self, 'imgbg'):
            return
        try:
            # 获取 tab1 当前的实际宽高
            tab1width = self.tab1.winfo_width()
            tab1height = self.tab1.winfo_height()

            # 如果窗口尚未初始化完成，宽高可能为 1 或 0，跳过
            if tab1width <= 1 or tab1height <= 1:
                return

            # 2. 使用 Pillow 按当前 tab1 尺寸 缩放图片
            pic = self.imgbg.resize((tab1width, tab1height), Image.Resampling.LANCZOS)

            # 3. 转换为 tkinter 可用的 PhotoImage 对象
            self.bgpic = ImageTk.PhotoImage(pic)

            # 4. 如果背景标签还没创建，则不处理
            if hasattr(self, 'bglabel'):
                # 否则就更新图片内容
                self.bglabel.configure(image=self.bgpic)

            # 5. 必须保留引用，否则图片会被垃圾回收导致不显示
            self.bglabel.image = self.bgpic

        except Exception as e:
            print("[刷新背景图片出错]", e)

    def toggle_left_panel(self):
        if not self.left_panel_is_minimized:
            # 最小化：sashpos 设为 10，左侧面板几乎消失
            self.paned.sashpos(0, 10)
            # 隐藏功能区 Frame（精准控制显隐）
            self.left_panel_frame.pack_forget()  # ✅ 功能按钮区域消失
            self.toggle_btn.config(text="》")
            self.left_panel_is_minimized = True
        else:
            # 恢复：sashpos 设回原宽度，比如 200
            self.paned.sashpos(0, self.left_panel_original_width)
            # 重新显示功能区 Frame
            self.left_panel_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5)  # ✅ 恢复显示
            self.toggle_btn.config(text="《")
            self.left_panel_is_minimized = False

    # 定义log_text_widget 写入函数
    def log_text_write(self, text_log):
        self.resultlabel.config(text=text_log)
